# For each..next

The for each..next control statement is a script iteration construct which executes one or several statements for each value in a comma separated list. The statements inside the loop enclosed by for and next will be executed for each value of the list.

Syntax:

Special syntax makes it possible to generate lists with file and directory names in the current directory.

for each var in list

[statements]

[exit for [ ( when | unless ) condition ]

[statements]

next [var]

Arguments:

Arguments

| Argument | Description |
| --- | --- |
| var | A script variable name which will acquire<br>a new value from list for each loop execution. If var<br>is specified after next it must<br>be the same variable name as the one found after the corresponding for each. |

The value of the var variable may be changed by statements inside the loop, but this is not good programming practice.

If an exit for clause is encountered inside the loop, the execution of the script will be transferred to the first statement after the next clause denoting the end of the loop. An exit for clause can be made conditional by the optional use of a when or unless suffix.

Information noteSince the for each..next statement is a control statement and as such is ended with either a semicolon or end-of-line, each of its three possible clauses (for each, exit for and next) must not cross a line boundary.

Syntax:

list := item { , item }

item := constant | (expression) | filelist mask | dirlist mask | fieldvaluelist mask

Arguments

| Argument | Description |
| --- | --- |
| constant | Any number or string. Note that a string written directly in the script must be enclosed by single quotes. A string without single quotes will be interpreted as a variable, and the value of the variable will be used. Numbers do not need to be enclosed by single quotes. |
| expression | An arbitrary expression. |
| mask | A filename or folder name mask which<br>may include any valid filename characters as well as the standard wildcard<br>characters, \* and ?.<br><br>You can use absolute file paths or lib:// paths. |
| condition | A logical expression evaluating to True or False. |
| statements | Any group of one or more Qlik Sense script<br>statements. |
| filelist mask | This syntax produces a comma separated list of all files in the current directory<br>matching the filename mask.<br><br>Information noteThis argument supports only library connections in standard mode. See [File system access restriction](https://help.qlik.com/en-US/sense/May2026/Subsystems/Hub/Content/Sense_Hub/LoadData/file-system-access-restriction.htm) |
| dirlist mask | This syntax produces a comma<br>separated list of all folders in the current folder matching the<br>folder name mask.<br><br>Information noteThis argument supports only library connections in standard mode. See [File system access restriction](https://help.qlik.com/en-US/sense/May2026/Subsystems/Hub/Content/Sense_Hub/LoadData/file-system-access-restriction.htm) |
| fieldvaluelist mask | This syntax iterates through the values of a field already loaded into Qlik Sense. |

Warning noteThe Qlik Web Storage Provider Connectors and other DataFiles connections do not support filter masks that use wildcard (\* and ?) characters.

Example 1: Loading a list of files

```
// LOAD the files 1.csv, 3.csv, 7.csv and xyz.csv
for each a in 1,3,7,'xyz'
   LOAD * from file$(a).csv;
next
```

Example 2: Creating a list of files on disk

This example loads a list of all Qlik Sense related files in a folder.

```

sub DoDir (Root)
   for each Ext in 'qvw', 'qva', 'qvo', 'qvs', 'qvc', 'qvf', 'qvd'

      for each File in filelist (Root&'/*.' &Ext)

         LOAD 
            '$(File)' as Name, 
            FileSize( '$(File)' ) as Size, 
            FileTime( '$(File)' ) as FileTime
         autogenerate 1;

      next File

   next Ext
   for each Dir in dirlist (Root&'/*' )

      call DoDir (Dir)

   next Dir

end sub

call DoDir ('lib://DataFiles')
```

Example 3: Iterating through a the values of a field

This example iterates through the list of loaded values of FIELD and generates a new field, NEWFIELD. For each value of FIELD, two NEWFIELD records will be created.

```

load * inline [
FIELD
one
two
three
];

FOR Each a in FieldValueList('FIELD')
LOAD '$(a)' &'-'&RecNo() as NEWFIELD AutoGenerate 2;
NEXT a 
```

The resulting table looks like this:

Example table

| NEWFIELD |
| --- |
| one-1 |
| one-2 |
| two-1 |
| two-2 |
| three-1 |
| three-2 |

## Learn more

* [For..next](https://help.qlik.com/en-US/sense/May2026/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptControlStatements/For.htm)
* [Next](https://help.qlik.com/en-US/sense/May2026/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptControlStatements/Next.htm)
* [Exit](https://help.qlik.com/en-US/sense/May2026/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptControlStatements/Exit.htm)